mkdir ./.vscode

# ANSI color
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
GRAY='\033[1;30m'
NC='\033[0m' # No Color

# Check dependencies and Info version 
check_dependency() {
    if ! command -v "$1" &> /dev/null; then
        echo -e "${RED}ERROR: Could not find $1,please check you environment variable or need other help${NC}"
        exit 1
    else
        echo -e "${GREEN}checking the version of $1${NC}"
        $1 --version | head -n 1  
    fi
}

echo -e "${BLUE}Check your environment...${NC}"
check_dependency arm-none-eabi-gcc
check_dependency cmake
check_dependency ninja
check_dependency clangd
check_dependency openocd

echo -e "${BLUE} 🌠Check environment has done ${NC}"

confirm_action() {
    local prompt="$1"
    local on_confirm="${2:-:}"  # 默认空操作（: 是 Bash 的空命令）
    local on_cancel="${3:-:}"
    
    while : ; do
        echo -e "${BLUE}${prompt}${NC} ${YELLOW}[Y/N]${NC}"
        read -r response

        case "$response" in
            [Yy]|"")
                # 执行确认操作
                eval "$on_confirm"
                return 0
                ;;
            [Nn])
                # 执行取消操作
                eval "$on_cancel"
                return 1
                ;;
            *)
                echo -e "${RED}无效输入，请按 Y 或 N${NC}"
                ;;
        esac
    done
}

print_logo(){
    echo -e "
    -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%+-.             
    .-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*-..        
      :#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*:.      
      ..*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#.     
        .+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=..  
         .-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#.. 
          .:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..
            .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*.
             .*@@@@@@@@@%@@@@@@@%@@@#++=++=++=++=++=++=++=++#%@@@%@@@@@@@@@@@@%-
              .:%@@%@@@@@@@@@%@@@@@@@%-..                   ..-%@@@@@@%@@@@@@@@*
                .-@@@@@@@@@@@@@@@@@@@@@#:.                    ..%@@@@@@@@@@@@@@@
                 ..*@@@@@@@@@@@@@@@@@@@@@+.                    .=@@@@@@@@@@@@@@@
                   ..#@@@@@@@@@@@@@@@@@@@@%:.                  .+@@@@@@@@@@@@@@@
                     .-%@@@@@@@@@@@@@@@@@@@@#.                .:@@@@@@@@@@@%@@@%
                       .::::::::::::::::::::::.             .:#@@@@@@@@@@@@@@@@=
             .%@%@%@%@%@@%%@%%%@%%%@%%%%@%%@%@%@%@%@%@%@%@%@@@@@@@@@@@@@%@@@@@%:
            .=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@-.
            .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=. 
            -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-.. 
          ..%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#:    
          .=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%:.     
          .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*:..      
         .-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*-.          
         .@@@@@@@@@@@@@@@%@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#*=....             
        .=@@@@@@@@@@@@%@@@@@@+.         .:=-=-=-=-=-=-=-=-=-=+*:..              
        :#@@@@@@@@@@%@@@@@@@%.           .=%@@@@@@@@@@@@@@@@@@@@*:.             
        -@@@@@@@@@@@@@@@@@@@-.             .*@@@@@@@@@@@@@@@@@@@@@+...          
      ..@@@@@@@@@@@@@@@@@@@#:               ..#@@@@@@@@@@@@@@@@@@@@%-..         
      .=@@@@@@@@@@@@@@@@@@@+.                ..-%@@@@@@@@@@@@@@@@@@@@*:.        
     .:#@@@@@@@@@%@@@@@@@@%..                  ..*%@@@@@@@@@@@@@@@@@@@@=..      
     .-@@@@@@@@@@@@@@@@@@@-                     ..:%@@@@@@@@@@@@@@@@@@@@%:.     
     .%@@@@@@@@@@@@@@@@@@#:                        .-@@@@@@@@@@@@@@@@@@@@@*:    
    .+@@@@@@@@@@@@@@@@@@@+.        .:++**+**+**+**+**+%@@@@@@@@@@@@@@@@@@@@@=.. 
    :#@@@@@@@@%@@@@@@@%@%.             :#@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@%:.
    =@@@@@@@@@@@@@@@@@@@-.               .:-#@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@#
  ..%@@@@@@@@@@@@@@@@@@#:                   ..:+#@@@@@@@@@@@@@@@%===============
 .:*@@@@@@@@@@@@@@@%@@@+.                        .:*%@@@@@@@@@@@@@+.            
-------------------=---..                           .:-#@@@@@@@@@@@%-.          
                                                       ..:=#@@@@@@@@@#:.        
                                                            .:+%@@@@@@@+..      
                                                               ..:#@@@@@@-.     
                                                                  ..:=#@@@#:..  
                                                                       .:+%@*:. 
                                                                          ..:#-.
 
"
}

confirm_action "♿准备好享受轮椅了吗♿" "print_logo" "echo -e '${RED}犹豫就会败北${NC}'; exit 1"

# ======================================================================
# build.sh
cat > ./.vscode/build.sh<< 'EOF'
#*
#*======================================================================
#*@brief: 执行构建和编译的自动化脚本
#*
#*@attention: 不需要修改此脚本的任何东西
#*
#*@auther: Cherno
#*======================================================================
#*
    
# ANSI color
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m' 
BLUE='\033[1;34m'
GRAY='\033[1;30m'
NC='\033[0m' # No Color

# Check and remove build
BUILD_DIR="build"
if [ "$(basename "$PWD")" = "build" ]; then
    echo -e "${RED}ERROR:Do not run this bash in build directory${NC}"
    exit 1
fi

if [ -d "$BUILD_DIR" ]; then
    echo -e "${YELLOW}WARNING: Removing existing build directory...${NC}"
    rm -rf "$BUILD_DIR"
    if [ $? -ne 0 ]; then
        echo -e "${RED}ERROR: Failed to remove build directory${NC}"
        exit 1
    fi
    echo -e "${GREEN}Build directory cleaned${NC}"
fi

# Set 
TOOLCHAIN_FILE="./cmake/gcc-arm-none-eabi.cmake"
BUILD_DIR="./build"
JOBS=8

# Check arm-gcc toolchain file
if [ ! -f "$TOOLCHAIN_FILE" ]; then
    echo -e "${RED}ERROR:Do not find toolchain file, please check if you have cmake/gcc-arm-none-eabi.cmake $TOOLCHAIN_FILE${NC}"
    exit 1
fi

#Configure and build
echo -e "${BLUE} 🌟Building...🌟 ${NC}"
cmake -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" -GNinja -B "$BUILD_DIR" -DCMAKE_PROJECT_NAME="temp"
if [ $? -ne 0 ]; then
    echo -e "${RED}Error:CMake configure failed ${NC}"
    exit 1
fi

# Reset clangd language server
restart_clangd() {
    ## 检查 clangd 是否安装
    if ! command -v clangd >/dev/null 2>&1; then
        echo -e "${GRAY}[Note] clangd not installed${NC}"
        return 1
    fi
    
    ## 检查是否已有 clangd 进程在运行
    if pgrep -x clangd >/dev/null; then
        echo -e "${RED}✗ clangd is already running${NC}"
        return 1
    fi
    
    ## 启动 clangd 并捕获输出
    if clangd >/dev/null 2>&1 & then
        echo -e "${GREEN}✓ clangd started (PID: $!)${NC}"
        return 0
    else
        echo -e "${RED}✗ Failed to start clangd${NC}"
        return 1
    fi
}
restart_clangd

# Compile with colored output
echo -e "${BLUE} ⚡Compiling...⚡ ${NC}"
cd "$BUILD_DIR" || exit 1

# 将编译输出保存到临时文件
TMP_COMPILE_LOG=$(mktemp)
ninja -j "$JOBS" 2>&1 | tee "$TMP_COMPILE_LOG"
COMPILE_RESULT=${PIPESTATUS[0]}

if [ $COMPILE_RESULT -ne 0 ]; then
    echo -e "\n${RED}ERROR:Compile failed${NC}"
    echo -e "${GRAY}====================================================================== ${NC}"
    grep --color=always -E 'error:|warning:|^FAILED' "$TMP_COMPILE_LOG" | awk '{
        if ($0 ~ /warning:/) {
            print "\033[33m" $0 "\033[0m" 
        } else if ($0 ~ /error:/) {
             print "\033[31m" $0 "\033[0m"
        } else {
            print $0
        }
    }'

    rm "$TMP_COMPILE_LOG"
    exit 1
fi

rm "$TMP_COMPILE_LOG"

echo ""

echo -e "${GRAY}Belongs to Laboratory 1024, RoboMaster Team Damocles of CCUT${NC}"

EOF

echo -e "${GREEN}🛠️The build.sh has been generated🛠️${NC}"
chmod +x ./.vscode/build.sh

# ======================================================================
# doownload.sh
cat > ./.vscode/download.sh << 'EOF'
#*
#*======================================================================
#*@brief: 执行烧录的自动化脚本
#*
#*@attention: 只需修改配置区的配置文件
#*
#*@auther: Cherno
#*======================================================================
#*
    
# 配置区（根据实际情况修改）
OPENOCD_INTERFACE_PATH="interface/stlink.cfg"
OPENOCD_TARGET_PATH="target/stm32f1x.cfg"

# ANSI color
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
GRAY='\033[1;30m'
NC='\033[0m' # No Color

# 检查 openocd 是否存在
OPENOCD_PATH=$(command -v openocd)
if [ -z "$OPENOCD_PATH" ]; then
    echo -e "${RED}Error: openocd 未找到，请确保已安装 openocd${NC}"
    exit 1
fi

check_file() {
    if [ ! -f "$1" ]; then
        echo -e "${RED}Error: missing - $1${NC}"
        exit 1
    fi
}

# 要烧录的固件路径
ELF_FILE="./build/temp.elf"

# 检查固件文件是否存在
check_file "$ELF_FILE"

# Check OpenOCD
echo -e "${BLUE}=== 开始连接检查 ===${NC}"
TMP_LOG=$(mktemp)

"$OPENOCD_PATH" -f "$OPENOCD_INTERFACE_PATH" \
                -f "$OPENOCD_TARGET_PATH" \
                -c "program $ELF_FILE verify reset exit"

"$OPENOCD_PATH" -f "$OPENOCD_INTERFACE_PATH" \
               -f "$OPENOCD_TARGET_PATH" \
               -c "program $ELF_FILE verify reset" \
               -c "shutdown" > "$TMP_LOG" 2>&1

# Error
if grep -q "OpenOCD init failed" "$TMP_LOG" || grep -q "Error:" "$TMP_LOG"; then
    echo -e "${RED}🤡烧录失败😭 错误分析：${NC}"
    echo "-----------------------------------------------"
    
    #芯片ID不适配
    if grep -q "UNEXPECTED idcode" "$TMP_LOG"; then
        echo -e "${RED}芯片ID🈲不适配${NC}"
        echo "检测到的ID: $(grep -oE "UNEXPECTED idcode: 0x[0-9A-F]+" "$TMP_LOG")"
        echo "预期ID: $(grep -oE "expected [0-9]+ of [0-9]+: 0x[0-9A-F]+" "$TMP_LOG")"
    fi

    # 芯片未连接
    if grep -q "open failed" "$TMP_LOG";then
        echo -e "${YELLOW}调试器无法与目标芯片建立连接${NC}"
        echo "请检查硬件接线,openocd配置,Link驱动"
    fi

    # 其他未知错误

fi

# Succeed
if grep -q "Programming Finished" "$TMP_LOG" || grep -q "Verified OK" "$TMP_LOG"; then
    echo -e "${BLUE}🥳烧录成功😋${NC}"
    echo "-----------------------------------------------"
fi

rm "$TMP_LOG"

echo ""
echo -e "${GRAY}Belongs to Laboratory 1024, RoboMaster Team Damocles of CCUT${NC}"


# 生成 launch.json
cat <<LAUNCH_EOF > .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "\${workspaceFolder}",
            "executable": "./build/temp.elf",
            "request": "launch",
            "type": "cortex-debug",
            "runToEntryPoint": "main",
            "servertype": "openocd",
            "showDevDebugOutput": "raw",
            "configFiles": [
                "$OPENOCD_INTERFACE_PATH",
                "$OPENOCD_TARGET_PATH"
            ],
            "liveWatch": {
                "enabled": true,
                "samplesPerSecond": 4,
             },
            //SWO      
            //     "swoConfig": {
            //     "enabled": true,
            //     "cpuFrequency": 72000000,  // STM32 CPU 主频(Hz)
            //     "swoFrequency": 2000000,  // SWO 时钟频率（通常 1-4MHz)
            //     "source": "probe",        // 使用调试探针(ST-Link/J-Link)
            //     "decoders": [
            //         {
            //             "label": "ITM Output",
            //             "type": "console",  // 输出到调试控制台
            //             "port": 0           // ITM Port 0
            //         },
            //         {
            //             "label": "Variable Graph",
            //             "type": "graph",    // 图形化显示变量
            //             "port": 1,           // ITM Port 1
            //             "variables": ["adc_value", "pwm_duty"]  // 要监视的变量
            //         }
            //     ]
            // },
            //  DWT
            // "dataWatchpoints": [
            //     {
            //         "variable": "g_counter",  // 要监控的变量
            //         "accessType": "write",    // 监控写入操作(可选:read/write/readWrite)
            //         "action": "log"           // 记录变化(可选:log/break)
            //     },
            //     {
            //         "variable": "g_flag",
            //         "accessType": "readWrite",  // 监控读写操作
            //         "action": "break"          // 触发断点
            //     }
            // ]
        }
    ]
}
LAUNCH_EOF
EOF

echo -e "${GREEN}🖲️The download.sh has been generated🖲️${NC}"
chmod +x ./.vscode/download.sh

# ======================================================================
# launch.json
cat > ./.clang-format << 'EOF'
---
Language:        Cpp
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveAssignments:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    true
AlignConsecutiveBitFields:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    false
AlignConsecutiveDeclarations:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: true
  AlignFunctionPointers: false
  PadOperators:    false
AlignConsecutiveMacros:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    false
AlignConsecutiveShortCaseStatements:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCaseArrows: false
  AlignCaseColons: false
AlignConsecutiveTableGenBreakingDAGArgColons:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    false
AlignConsecutiveTableGenCondOperatorColons:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    false
AlignConsecutiveTableGenDefinitionColons:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionDeclarations: false
  AlignFunctionPointers: false
  PadOperators:    false
AlignEscapedNewlines: Left
AlignOperands:   Align
AlignTrailingComments:
  Kind:            Always
  OverEmptyLines:  0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseExpressionOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
AllowShortNamespacesOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AttributeMacros:
  - __capability
BinPackArguments: true
BinPackParameters: BinPack
BitFieldColonSpacing: Both
BraceWrapping:
  AfterCaseLabel:  false
  AfterClass:      false
  AfterControlStatement: Never
  AfterEnum:       false
  AfterExternBlock: false
  AfterFunction:   true
  AfterNamespace:  false
  AfterObjCDeclaration: false
  AfterStruct:     false
  AfterUnion:      false
  BeforeCatch:     false
  BeforeElse:      false
  BeforeLambdaBody: false
  BeforeWhile:     false
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Leave
BreakAfterJavaFieldAnnotations: false
BreakAfterReturnType: None
BreakArrays:     true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: Always
BreakBeforeBraces: Custom
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakBinaryOperations: Never
BreakConstructorInitializers: BeforeColon
BreakFunctionDefinitionParameters: false
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
BreakTemplateDeclarations: Yes
ColumnLimit:     80
CommentPragmas:  '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat:   false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IfMacros:
  - KJ_IF_MAYBE
IncludeBlocks:   Regroup
IncludeCategories:
  - Regex:           '^<ext/.*\.h>'
    Priority:        2
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '^<.*\.h>'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '^<.*'
    Priority:        2
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '.*'
    Priority:        3
    SortPriority:    0
    CaseSensitive:   false
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: true
IndentExportBlock: true
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: None
IndentRequiresClause: true
IndentWidth:    4
IndentWrappedFunctionNames: false
InsertBraces:    false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
  Binary:          0
  BinaryMinDigits: 0
  Decimal:         0
  DecimalMinDigits: 0
  Hex:             0
  HexMinDigits:    0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLines:
  AtEndOfFile:     false
  AtStartOfBlock:  false
  AtStartOfFile:   true
KeepFormFeed:    false
LambdaBodyIndentation: Signature
LineEnding:      DeriveLF
MacroBlockBegin: ''
MacroBlockEnd:   ''
MainIncludeChar: Quote
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PackConstructorInitializers: NextLine
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakBeforeMemberAccess: 150
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
PPIndentWidth:   -1
QualifierAlignment: Leave
RawStringFormats:
  - Language:        Cpp
    Delimiters:
      - cc
      - CC
      - cpp
      - Cpp
      - CPP
      - 'c++'
      - 'C++'
    CanonicalDelimiter: ''
    BasedOnStyle:    google
  - Language:        TextProto
    Delimiters:
      - pb
      - PB
      - proto
      - PROTO
    EnclosingFunctions:
      - EqualsProto
      - EquivToProto
      - PARSE_PARTIAL_TEXT_PROTO
      - PARSE_TEST_PROTO
      - PARSE_TEXT_PROTO
      - ParseTextOrDie
      - ParseTextProtoOrDie
      - ParseTestProto
      - ParsePartialTestProto
    CanonicalDelimiter: pb
    BasedOnStyle:    google
ReferenceAlignment: Pointer
ReflowComments:  Always
RemoveBracesLLVM: false
RemoveEmptyLinesInUnwrappedLines: false
RemoveParentheses: Leave
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SkipMacroDefinitionBody: false
SortIncludes:    CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeJsonColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
  AfterControlStatements: true
  AfterForeachMacros: true
  AfterFunctionDefinitionName: false
  AfterFunctionDeclarationName: false
  AfterIfMacros:   true
  AfterOverloadedOperator: false
  AfterPlacementOperator: true
  AfterRequiresInClause: false
  AfterRequiresInExpression: false
  BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 2
SpacesInAngles:  Never
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
  Minimum:         1
  Maximum:         -1
SpacesInParens:  Never
SpacesInParensOptions:
  ExceptDoubleParentheses: false
  InCStyleCasts:   false
  InConditionalStatements: false
  InEmptyParentheses: false
  Other:           false
SpacesInSquareBrackets: false
Standard:        Auto
StatementAttributeLikeMacros:
  - Q_EMIT
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
TableGenBreakInsideDAGArg: DontBreak
TabWidth:        4
UseTab:          ForIndentation
VerilogBreakBetweenInstancePorts: true
WhitespaceSensitiveMacros:
  - BOOST_PP_STRINGIZE
  - CF_SWIFT_NAME
  - NS_SWIFT_NAME
  - PP_STRINGIZE
  - STRINGIZE
WrapNamespaceBodyWithEmptyLines: Leave
...


EOF

echo -e "${GREEN}🚀The .clang-format has been generated🚀${NC}"

# ======================================================================
get_compiler() {
    local compiler_name=$1  # 传入编译器名称：gcc 或 g++
    # 查找编译器（兼容Linux和Windows）
    COMPILER=$(command -v "arm-none-eabi-$compiler_name" 2>/dev/null || command -v "arm-none-eabi-$compiler_name.exe" 2>/dev/null)
    [ -z "$COMPILER" ] && return

    # 如果是Windows环境（Git Bash/MSYS/Cygwin）
    if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$(uname -o 2>/dev/null)" == "Msys" ]]; then
        # 转换路径格式：反斜杠→正斜杠，小写盘符→大写，确保.exe后缀
        COMPILER=$(echo "$COMPILER" | sed -e 's/\\/\//g' -e 's/^\/\([a-z]\)\//\U\1:\//' -e 's/\('"arm-none-eabi-$compiler_name"'\)$/\1.exe/')
    fi

    echo "$COMPILER"
}

GCC_COMPILER_PATH=$(get_compiler gcc)
GPP_COMPILER_PATH=$(get_compiler g++)

# setting.json
cat > ./.vscode/settings.json << EOF
{
  "clangd.arguments": [
  "--function-arg-placeholders=false",
  "--header-insertion=never",
  "--query-driver=${GPP_COMPILER_PATH:-null}",
  "--query-driver=${GCC_COMPILER_PATH:-null}",
  ],
  
  "clang-format.style" : "file",
  "clang-format.assumeFilename": "./.clang-format",
  "clang-format.executable":"clang-format",
  
  "editor.defaultFormatter": "xaver.clang-format",
  "editor.tabSize": 4,
  "editor.insertSpaces": true,

  "VsCodeTaskButtons.tasks": [
    {
      "label": "🔧Build and Compile",
      "task": "build",
      "alignment": "left",
      "color": "default",
    },
    {
      "label": "🖲️Download",
      "task": "download",
      "alignment": "left",
      "color": "default",
    }
  ]
}

EOF

echo -e "${GREEN}⚙️The setting.json has been generated⚙️${NC}"

# ======================================================================
# tasks.json
cat > ./.vscode/tasks.json << 'EOF'
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build",
      "type": "shell",
      "command": "./.vscode/build.sh",
      "windows": {
        "command": "bash",
        "args": ["-c", "./.vscode/build.sh"]
      },
      "group": "build",
      "presentation": {
        "reveal": "always",
        "panel": "dedicated",
        "clear": true
      }
    },

    {
      "label": "download",
      "type": "shell",
      "command": "./.vscode/download.sh",
      "windows": {
        "command": "bash",
        "args": ["-c", "./.vscode/download.sh"]
      },
      "group": "build",
      "presentation": {
        "reveal": "always",
        "panel": "dedicated",
        "clear": true
      }

    }
  ]
}

EOF

echo -e "${GREEN}🏆The tasks.json has been generated🏆${NC}"
echo ""
echo -e "${RED}◣◥DRANGR◣◥DRANGR◣◥DRANGR◣◥DRANGR◣◥${NC}"

create_template()
{
  mkdir ./template
  cat > ./template/template.c<< 'EOF'
/**
 *=============================================================================
 *  @copyright (C)      2025CCUT_1024lab_Damocles
 *
 *  @file    template.c
 *  @brief   封装模块代码规范
 *
 *  @note    使用方法
 *
 *  @attention 注意事项
 *-----------------------------------------------------------------------------
 *  @version    @author    @date    @note
 *  V1.0.0      Cherno    250808    done
 *
 *==============================================================================
 */

/*==============================Includes======================================*/

/*==============================PrivateMacros=================================*/

/*==============================PrivateTypes==================================*/

/*==============================PrivateVariables==============================*/

/*==============================PrivateFunctionDeclarations===================*/

/*==============================FunctionPrototypes============================*/

/**
 * @brief : 描述该函数主要功能
 * @note : 注意事项
 *
 * @param : 参数名（与函数里的参数一致）  参数的描述
 * @return : 返回值的说明
 */

/*========================COPYRIGHT(C) CCUT-DAMOCLES==========================*/

EOF

 echo -e "${GREEN}🎊The template.c has been generated🎊${NC}"

cat >./template/template.h << 'EOF'
#ifndef __X_H__
#define __X_H__

#ifdef __cplusplus
extern "C" {
#endif

/*=============================Include========================================*/

/*==============================ExportedMacros================================*/

/*=============================ExportedTypes==================================*/

/*=============================ExportedDefinitions============================*/

/*=============================ExportedFunctionDeclarations===================*/

#ifdef __cplusplus
}
#endif

#endif

/*========================COPYRIGHT(C) CCUT-DAMOCLES==========================*/

EOF

 echo -e "${GREEN}🎑The template.h has been generated🎑${NC}"

}

confirm_action "是否生成template文件" "create_template" "echo -e '${RED}重塑1024荣光,我辈义不容辞${NC}'"

confirm_action "是否保留cherno.sh" "echo -e '${GREEN}🎐如 你 所 愿${NC}'" " rm '$0'  " 

sleep 0.5
echo -e "
# =====================================================================
# @file cherno.sh 
# 
# @brief 为电控组内准备的STM32工程配置自启动脚本
#      
# @note 1.在linux终端(Windows可以使用git bash)中执行./cherno.sh即可
#       2.适配windows和linux不同环境,没有做macOS适配
#       3.需要插件clangd,Cortex-Debug,其他随意,推荐Task Buttons
#       4.生成的.vscode中只需要改download.sh中的配置  
#      
# ---------------------------------------------------------------------
# @auther Cherno
# @version  date
#   1.0.0  250722    生成build.sh download.sh tasks.josn setting.josn
#   1.0.1  250724    添加launch.josn,可以调试
#   1.0.2  250727    适配Windows ，增加交互
#   1.0.3  250730    添加.clang-format 
#   1.0.4  250806    优化build.sh download.sh,减少路径依赖
#   1.0.5  250807    修复了clangd无法找到标准库的bug,添加rmLOGO
#   1.0.6  250808    优化交互,修复打印两遍LOGO的bug,添加template 
#   1.0.7  250810    修复Windows找不到路径的bug,添加环境检查
#   1.0.8  250816    优化编译报错逻辑,优化规范template文件
#   1.0.9  250817    优化调试,增加LiveWatch,SWO(ITM),DWT
#   1.1.0  250828    修改template,增加C++优化  
# =====================================================================
"
echo -e "${GRAY}Belongs to Laboratory 1024, RoboMaster Team Damocles of CCUT®${NC}"
